summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java
blob: 3586a9b349e2f898dc3fd7c8954240a0c32626c3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright 2020 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.

package org.citra.citra_emu.applets;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;

import org.citra.citra_emu.NativeLibrary;
import org.citra.citra_emu.R;
import org.citra.citra_emu.activities.EmulationActivity;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;

public final class MiiSelector {
    public static class MiiSelectorConfig implements java.io.Serializable {
        public boolean enable_cancel_button;
        public String title;
        public long initially_selected_mii_index;
        // List of Miis to display
        public String[] mii_names;
    }

    public static class MiiSelectorData {
        public long return_code;
        public int index;

        private MiiSelectorData(long return_code, int index) {
            this.return_code = return_code;
            this.index = index;
        }
    }

    public static class MiiSelectorDialogFragment extends DialogFragment {
        static MiiSelectorDialogFragment newInstance(MiiSelectorConfig config) {
            MiiSelectorDialogFragment frag = new MiiSelectorDialogFragment();
            Bundle args = new Bundle();
            args.putSerializable("config", config);
            frag.setArguments(args);
            return frag;
        }

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            final Activity emulationActivity = Objects.requireNonNull(getActivity());

            MiiSelectorConfig config =
                    Objects.requireNonNull((MiiSelectorConfig) Objects.requireNonNull(getArguments())
                            .getSerializable("config"));

            // Note: we intentionally leave out the Standard Mii in the native code so that
            // the string can get translated
            ArrayList<String> list = new ArrayList<>();
            list.add(emulationActivity.getString(R.string.standard_mii));
            list.addAll(Arrays.asList(config.mii_names));

            final int initialIndex = config.initially_selected_mii_index < list.size()
                    ? (int) config.initially_selected_mii_index
                    : 0;
            data.index = initialIndex;
            AlertDialog.Builder builder =
                    new AlertDialog.Builder(emulationActivity)
                            .setTitle(config.title.isEmpty()
                                    ? emulationActivity.getString(R.string.mii_selector)
                                    : config.title)
                            .setSingleChoiceItems(list.toArray(new String[]{}), initialIndex,
                                    (dialog, which) -> {
                                        data.index = which;
                                    })
                            .setPositiveButton(android.R.string.ok, (dialog, which) -> {
                                data.return_code = 0;
                                synchronized (finishLock) {
                                    finishLock.notifyAll();
                                }
                            });
            if (config.enable_cancel_button) {
                builder.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
                    data.return_code = 1;
                    synchronized (finishLock) {
                        finishLock.notifyAll();
                    }
                });
            }
            setCancelable(false);
            return builder.create();
        }
    }

    private static MiiSelectorData data;
    private static final Object finishLock = new Object();

    private static void ExecuteImpl(MiiSelectorConfig config) {
        final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get();

        data = new MiiSelectorData(0, 0);

        MiiSelectorDialogFragment fragment = MiiSelectorDialogFragment.newInstance(config);
        fragment.show(emulationActivity.getSupportFragmentManager(), "mii_selector");
    }

    public static MiiSelectorData Execute(MiiSelectorConfig config) {
        NativeLibrary.sEmulationActivity.get().runOnUiThread(() -> ExecuteImpl(config));

        synchronized (finishLock) {
            try {
                finishLock.wait();
            } catch (Exception ignored) {
            }
        }

        return data;
    }
}